import java.util.*;
public class KantineSimulatie {
    // kantine
    private Kantine kantine;
    // kantineaanbod
    private KantineAanbod kantineaanbod;
    // random generator
    private Random random;
    
    private String[] test;
    // aantal artikelen
    private static final int AANTAL_ARTIKELEN=4;
    
    private static final String[] DAGEN=
    new String[] {"Maandag", "Dinsdag", "Woensdag", "Donderdag", "Vrijdag", "Zaterdag", "Zondag"};
    // artikelen
    private static final String[] artikelnamen=
    new String[] {"Koffie","Broodje hamburger", "Broodje kaas", "Melk"};
    // prijzen
    private static double[] artikelprijzen=
    new double[]{1.50, 2.10, 1.65, 1.65};
    // minimum en maximum aantal artikelen per soort
    private static final int MIN_ARTIKELEN_PER_SOORT=100;
    private static final int MAX_ARTIKELEN_PER_SOORT=300;
    // minimum en maximum aantal personen per dag
    private static final int STUDENTEN_KANS=89;
    private static final int DOCENTEN_KANS=10;
    private static final int KANTINEMEDEWERKERS_KANS=1;
    
    private static final int AANTAL_PERSONEN=100;
    // minimum en maximum artikelen per persoon
    private static final int MIN_ARTIKELEN_PER_PERSOON=1;
    private static final int MAX_ARTIKELEN_PER_PERSOON=4;
    /**
    * Constructor
    */
    public KantineSimulatie()
    {
        kantine=new Kantine();
        random=new Random();
        int[] hoeveelheden = getRandomArray(AANTAL_ARTIKELEN,MIN_ARTIKELEN_PER_SOORT, MAX_ARTIKELEN_PER_SOORT);
        kantineaanbod = new KantineAanbod(artikelnamen, artikelprijzen, hoeveelheden);
        kantine.setKantineAanbod(kantineaanbod);
    }
    /**
    * Methode om een array van random getallen liggend tussen min en max
    * van de gegeven lengte te genereren
    * @param lengte
    * @param min
    * @param max
    * @return De array met random getallen
    */
    private int[] getRandomArray(int lengte, int min, int max)
    {
        int[] temp=new int[lengte];
        for(int i=0;i<lengte;i++) {
            temp[i]=getRandomValue(min, max);
        }
        return temp;
    }
    /**
    * Methode om een random getal tussen min(incl) en max(incl) te genereren.
    * @param min
    * @param max
    * @return Een random getal
    */
    private int getRandomValue(int min, int max)
    {
        return random.nextInt(max-min+1)+min;
    }
    /**
    * Methode om op basis van een array van indexen voor de array
    * artikelnamen de bijhorende array van artikelnamen te maken
    * @param indexen
    * @return De array met artikelnamen
    */
    private String[] geefArtikelNamen(int[] indexen)
    {
        String[] artikelen=new String[indexen.length];
        for(int i=0;i<indexen.length;i++)
        {
            artikelen[i]=artikelnamen[indexen[i]];
        }
        return artikelen;
    }
    /**
    * Deze methode simuleert een aantal dagen in het verloop van de kantine
    * @param dagen
    */
    public void simuleer(int dagen)
    {
        int[] dagAantalArtikelen = new int[dagen];
        double[] dagOmzetArtikelen = new double[dagen];
        this.test = new String[AANTAL_PERSONEN];
    // for lus voor dagen
        for(int i=0;i<dagen;i++)
        {
            // laat de personen maar komen...
                for(int j=0;j<AANTAL_PERSONEN;j++)
                {
                    Persoon persoon;
                    int persoonNummer = getRandomValue(1, AANTAL_PERSONEN);
                    // maak persoon en dienblad aan, koppel ze
                    if (persoonNummer <= STUDENTEN_KANS)
                    {
                        persoon = new Student();
                    }
                    else if (persoonNummer > STUDENTEN_KANS && persoonNummer <= (STUDENTEN_KANS + DOCENTEN_KANS))
                    {
                        persoon = new Docent();
                    }
                    else if (persoonNummer > (STUDENTEN_KANS + DOCENTEN_KANS) && persoonNummer <= (STUDENTEN_KANS + DOCENTEN_KANS + KANTINEMEDEWERKERS_KANS))
                    {
                        persoon = new KantineMedewerker();
                    }
                    else
                    {
                        persoon = new Persoon();
                    }
                    //Persoon persoon = new Persoon();
                    persoon.pakDienblad(new Dienblad());
                    // bedenk hoeveel artikelen worden gepakt
                    int aantalartikelen = this.getRandomValue(MIN_ARTIKELEN_PER_PERSOON, MAX_ARTIKELEN_PER_PERSOON);;
                    // genereer de “artikelnummers”, dit zijn indexen
                    // van de artikelnamen array
                    int[] tepakken=getRandomArray(aantalartikelen, 0, AANTAL_ARTIKELEN-1);
                    // vind de artikelnamen op basis van de indexen hierboven
                    String[] artikelen=geefArtikelNamen(tepakken);
                    // loop de kantine binnen, pak de gewenste artikelen, sluit aan
                    kantine.loopPakSluitAan(persoon, artikelen);
                    persoon.drukAf();
                }
            // verwerk rij voor de kassa
            kantine.verwerkRijVoorKassa();
           
            //Update de voorraad
            this.kantineaanbod.updateVoorraad(this.artikelnamen, this.artikelprijzen, MIN_ARTIKELEN_PER_SOORT, MAX_ARTIKELEN_PER_SOORT);
            // druk de dagtotalen af en hoeveel personen binnen zijn gekomen
            /*System.out.print("Dagtotaal dag " + i + ": ");
            System.out.print(kantine.getKassa().aantalArtikelen() + " artikelen ");
            System.out.print("voor het bedrag " + kantine.getKassa().hoeveelheidGeldInKassa());
            System.out.println();*/
            
            dagAantalArtikelen[i] = kantine.getKassa().aantalArtikelen();
            dagOmzetArtikelen[i] = kantine.getKassa().hoeveelheidGeldInKassa();
            // reset de kassa voor de volgende dag
            kantine.getKassa().resetKassa(); 
        }
    
        System.out.println("Gemiddeld passeerden er " + Administratie.berekenGemiddeldAantal(dagAantalArtikelen) + " artikelen de kassa per dag.");
        System.out.println("Gemiddeld was de omzet " + Administratie.berekenGemiddeldeOmzet(dagOmzetArtikelen) + " per dag.");
        double[] dagOmzet = Administratie.berekenDagOmzet(dagOmzetArtikelen);
        for (int k = 0; k < dagOmzet.length; k++)
        {
            System.out.println("De totaalomzet op " + DAGEN[k] + " was: " + dagOmzet[k]);
        }
        Administratie.berekenGemiddeldeOmzet(dagOmzetArtikelen);
        Administratie.berekenGemiddeldAantal(dagAantalArtikelen);
    }
}